TITL DAI FIRMWARE 1E000-1E22A V1.0 Rev.1 ORG :E000 * * * * =================== *** MATH./SOUND PACKAGE *** * =================== * * The sound package starts at 1EE6E. * * ============= *** MATH. PACKAGE *** * ============= * * Called by RST 4: DATA XX. XX indicates the * offset from #E000 for the different entrypoints. * * The routines jumped to by RST 4: DATA 7B-F3 are * identical to RST 4; DATA 00-78, but for use with * the AMD9511A Math.chip. * Which routines are used, depends on the offset * in RAM address #00D4. * * The accumulator is the MACC (00D5-00D8) or the * math.chip accu MTOS. * ************************ * SOFTWARE ENTRYPOINTS * ************************ * * #00D4 contains offset 00. * *SVECA MFADD JMP :EDAA FPT addition MFSUB JMP :EDB4 FPT subtraction MFMUL JMP :E0FE FPT multiplication MFDIV JMP :E108 FPT division MLOAD JMP :E112 Copy operand to accu MSAVE JMP :E11C Copy accu to operand MPUT JMP :E126 Copy reg A,B,C,D to accu MGET JMP :E133 Copy accu to reg A,B,C,D MFABS JMP :E140 FPT ABS MFCHS JMP :E14A FPT change sign accu MFINT JMP :E443 FPT INT(X) MFRAC JMP :E154 FPT FRAC MPWR JMP :E855 FPT power MLN JMP :E745 LOG MEXP JMP :E667 EXP MLOG JMP :E870 LOGT MALOG JMP :E880 ALOG MSQRT JMP :E5F8 SQR MSIN JMP :E7D2 SIN MCOS JMP :E7D9 COS MTAN JMP :E894 TAN MASIN JMP :E96C ASIN MACOS JMP :E9C1 ACOS MATAN JMP :E8AC ATN MFIX JMP :E414 Change accu to INT MFLT JMP :E3DE Change accu to FPT MIADD JMP :E16D INT addition MISUB JMP :E18D INT subtraction MIMUL JMP :E1AC INT multiplication MIDIV JMP :E22B INT division MIREM JMP :E238 INT divide remainder MIABS JMP :E30B INT ABS MICHS JMP :E315 INT change sign accu MIAND JMP :E32E IAND MIOR JMP :E345 IOR MIXOR JMP :E35C IXOR MINOT JMP :E373 INOT MSHL JMP :E3A5 SHL MSHR JMP :E398 SHR MSA00 JMP :EDC0 Part of SAVEA L1E274 JMP :EFA6 Bank return * ************************ * HARDWARE ENTRYPOINTS * ************************ * * #00D4 contains offset #7B from #E000 as base * for HVECA. * HVECA JMP :E474 FPT addition JMP :E479 FPT subtraction JMP :E47E FPT multiplication JMP :E483 FPT division JMP :E588 Copy operand to accu JMP :E599 Copy accu to operand JMP :E55F Copy reg A,B,C,D to accu JMP :E56F Copy accu to reg A,B,C,D JMP :E488 FPT ABS JMP :E493 FPT change sign accu JMP :E498 FPT INT(X) JMP :E4A0 FPT FRAC JMP :EDA1 FPT power JMP :E4B1 LOG JMP :E4B6 EXP JMP :E4BB LOGT JMP :E4C0 ALOG JMP :E4CC SQR JMP :E4D1 SIN JMP :E4D6 COS JMP :E4DB TAN JMP :E4E0 ASIN JMP :E4E5 ACOS JMP :E4EA ATN JMP :E4EF Change accu to INT JMP :E49B Change accu to FPT JMP :E4F4 INT addition JMP :E4F9 INT subtraction JMP :E4FE INT multiplication JMP :E503 INT division JMP :E508 INT divide remainder JMP :E517 INT ABS JMP :E522 INT change sign accu JMP :ED19 IAND JMP :ED26 IOR JMP :ED33 IXOR JMP :ED43 INOT JMP :ED6C SHL JMP :ED55 SHR JMP :EDC0 Part of SAVEA ) Not via JMP :EFA6 Bank return ) AMD9511 * DATA :FF DATA :FF DATA :FF DATA :FF DATA :FF DATA :FF DATA :FF DATA :FF * ********************** * FPT MULTIPLICATION * ********************** * * MACC = MACC * MEM. * * Entry: HL: Points to multiplier. * Exit: All registers preserved. * XFMUL PUSH PSW PUSH B PUSH D PUSH H CALL :EA59 FPT multiplication JMP :C14D Popall, ret * **************** * FPT DIVISION * **************** * * MACC = MACC / MEM. * * Entry: HL: Points to divisor. * Exit: All registers preserved. * XFDIV PUSH PSW PUSH B PUSH D PUSH H CALL :EA20 FPT division JMP :C14D Popall, ret * ************************** * COPY OPERAND INTO MACC * ************************** * * Entry: HL: Points to operand. * Exit: All registers preserved. * XLOAD PUSH PSW PUSH B PUSH D PUSH H CALL :E9FB Copy operand in MACC JMP :C14D Popall, ret * ************************ * COPY MACC TO OPERAND * ************************ * * Entry: HL: Points to operand. * Exit: All registers preserved. * XSAVE PUSH PSW PUSH B PUSH D PUSH H CALL :E9D6 Copy MACC to operand JMP :C14D Popall, ret * ************************************ * COPY REGISTERS A,B,C,D INTO MACC * ************************************ * * Entry: None. * Exit: All registers preserved. * XPUT PUSH H MOV H,D ) MOV L,C ) DC in HL SHLD :00D7 Copy D,C into 00D8/7 MOV H,B ) MOV L,A ) BA in HL SHLD :00D5 Copy B,A into 00D6/5 POP H RET * ************************************ * COPY MACC INTO REGISTERS A,B,C,D * ************************************ * * Entry: None. * Exit: EHLF preserved. * XGET PUSH H LHLD :00D7 Get lobytes MACC MOV C,L ) MOV D,H ) Into registers C,D LHLD :00D5 Get hibytes MACC MOV A,L ) MOV B,H ) Into registers A,B POP H RET * *********** * FPT ABS * *********** * * For FPT values: MACC = Absolute value * of MACC. * * Entry: None. * Exit: All registers preserved. * XFABS PUSH PSW PUSH B PUSH D PUSH H CALL :E9EE Take abs.value of MACC JMP :C14D Popall, ret * ************************* * FPT: CHANGE SIGN MACC * ************************* * * For FPT values: MACC = - MACC * * Entry: None. * Exit: All registers preserved. * XFCHS PUSH PSW PUSH B PUSH D PUSH H CALL :E9E4 Change sign MACC JMP :C14D Popall, ret * ************ * FPT FRAC * ************ * * The FPT number in the MACC is replaced by its * fractional part. * * Entry: None. * Exit: All registers preserved. * XFRAC PUSH PSW PUSH H CALL :C21E Save MACC on stack CALL :E443 Take INT value of MACC LXI H,:0000 DAD SP Pnts to orig MACC on stack CALL :EDB4 Subtract INT(MACC)-MACC CALL :E14A Make result positive again INX SP INX SP INX SP INX SP Correct SP POP H POP PSW RET * ******************** * INTEGER ADDITION * ******************** * * Signed 32-bit addition: MACC = MACC + MEM. * Evt. overflow handling via CO4B. * * Entry: HL: Points to 1st byte of operand. * Exit: All registers preserved. * XIADD PUSH PSW PUSH B PUSH D PUSH H CALL :E38C MACC into reg E,B,C,A REM D = compl 00D5 EXOR M PUSH D ADD M ) MOV D,A ) DCX H ) MOV A,C ) ADC M ) Add contents MEM to EBCA MOV C,A ) Result in EBCD DCX H ) MOV A,B ) ADC M ) MOV B,A ) DCX H ) MOV A,E ) ADC M ) MOV E,A ) RAR Evt carry in msb XRA E Msb=1 if overflow POP H Get compl 00D5 EXOR M REM (0 if different signbits) ANA H Overflow only if different REM signbits L1E11 CM :C04B Then run overflow error JMP :E384 Copy E into A; Then reg REM ABCD into MACC * *********************** * INTEGER SUBTRACTION * *********************** * * Signed 32-bit subtraction: MACC = MACC - MEM. * Evt. overflow handling via CO4B. * * Entry: HL: Points to 1st byte of operand. * Exit: All registers preserved. * XISUB PUSH PSW PUSH B PUSH D PUSH H CALL :E38C Copy MACC into reg EBCA REM D = compl 00D5 EXOR M PUSH D SUB M ) MOV D,A ) DCX H ) MOV A,C ) SBB M ) MOV C,A ) Subtract EBCA - MEM DCX H ) Result in EBCD MOV A,B ) SBB M ) MOV B,A ) DCX H ) MOV A,E ) SBB M ) MOV E,A ) RAR Evt carry in msb XRA E Msb=1 if overflow POP H Get compl 00D5 EXOR M ORA H CMA ORA A Msb=1 ? JMP :E187 Evt run overflow error; REM Copy result into MACC * ************************** * INTEGER MULTIPLICATION * ************************** * * Signed 32-bit multiplication: MACC = MACC * MEM. * The overflow exit is taken if both factors are * more than 2 bytes or the product is longer than * the signbit of the 4th byte. * If MEM > 2 bytes, than MACC into DE and MEM into * MACC, assuming that MACC is max. 2 bytes. * * Entry: HL: Points to multiplier. * Exit: All registers preserved. * XIMUL PUSH PSW PUSH B PUSH D PUSH H LDA :00D5 Get sign byte ORA A CM :E315 If nr <0: change sign JC :E225 (Don't work: E315 preserves REM flags; ORA A clears CY) XRA M Final sign bit in S-flag PUSH PSW Save it MOV A,M ) INX H ) ORA A ) Get MEM into BCDE MOV B,A ) Set flags on sign byte MOV C,M ) INX H ) MOV D,M ) INX H ) MOV E,M ) CM :E3C9 If MEM <0: negate BCDE JC :E225 Error exit if overflow ORA C JZ :E1DF Jump if MEM <= 2 bytes REM * MEM > 2 bytes: exchange MACC with BCDE: REM LHLD :00D5 Get hibytes MACC MOV A,H ORA L JNZ :E225 Overflow exit if MACC > REM 2 bytes LHLD :00D7 Get lobytes MACC in HL CALL :E3CF Copy reg BCDE (=MEM) into REM MACC MOV D,L ) MOV E,H ) Orig. MACC into DE REM * Now 4-byte nr in MACC and 2 byte nr in DE: REM L1E14 LXI H,:0000 PUSH H 0000 on stack LXI H,:00D8 Addr lobyte MACC MOV C,M lobyte in C L1E15 XTHL On stack: addr current MACC REM byte MOV A,C Current byte in A ORA A JZ :E21E Jump if byte=0 MVI B,:80 L1E16 MOV A,C ) Current MACC byte in A RAR ) MOV C,A ) JNC :E1F6 ) SHR reg H,L and B as long REM ) no carry from C DAD D ) Else: Add other nr to HL L1E17 MOV A,H ) RAR ) MOV H,A ) MOV A,L )-- Effect: Multiply MACC by RAR ) DE, result in B MOV L,A ) MOV A,B ) RAR ) MOV B,A ) JNC :E1EF ) Do L1E16 max 8 times XTHL HL pnts to current MACC byte MOV M,B Result in MACC byte DCX H Pnts to next lower MACC byte MOV A,L Get lobyte of addr CPI :D4 Ready? MOV C,M Get next lower byte in C JNZ :E1E7 Not ready: mult. next byte REM * Multiplication done: REM POP H MOV A,B Get last result ORA A JM :E225 Error exit if overflow MOV A,H ) ORA L ) Check if HL<>0 JNZ :E225 Then overflow exit L1E19 POP PSW Get final sign in S-flag CM :E315 Change sign MACC if nr must REM be negative JMP :C14D Popall, ret REM * If MACC byte = 0: REM L1E20 MOV B,L ) Move bytes in HLB one byte MOV L,H ) down MVI H,:00 ) JMP :E202 Go to next MACC byte REM * If overflow error: REM L1E21 CALL :C04B Run overflow error JMP :E217 Quit * * * UNL SVECA EQU MFADD LST END